<?php

if (!function_exists('pick_array')) {
    /**
     * 在一个数组中 根据key拾取新数组
     * @param $arrData      原数组
     * @param array $keys   key值    ['A', 'B', 'C' => 'D']
     * @param bool  $filter 是否过滤掉不存在的key？ true 默认原数组不存在过滤掉 | flase key不存在null填充
     * @return array
     */
    function pick_array ($arrData, $keys = [], $filter = true) {
        $newArr = [];
        foreach ($keys as $k => $v) {
            if (is_integer($k)) {
                if ($filter) {
                    isset($arrData[$v]) && $newArr[$v] = $arrData[$v];
                } else {
                    $newArr[$v] = $arrData[$v] ?? null;
                }
            } else {
                if ($filter) {
                    isset($arrData[$k]) && $newArr[$v] = $arrData[$k];
                } else {
                    $newArr[$v] = $arrData[$k] ?? null;
                }
            }
        }
        return $newArr;
    }
}
if (!function_exists('init_array')) {
    /**
     * 初始化数组
     * @param $arrData
     * @param array $initMap
     * @param bool $forse
     * @return array
     */
    function init_array ($arrData, $initMap = [], $forse = true) {
        foreach ($initMap as $k => $v) {
            if ((isset($arrData[$k]) && is_null($arrData[$k])) || !isset($arrData[$k])){
                $arrData[$k] = $v;
            }
        }
        return $arrData;
    }
}

if (!function_exists('throw_exception')) {

    /**
     * 抛出项目内异常 被异常监控
     * @param null $errMessage
     * @param array $errorData 异常信息
     * @return void 异常数据
     * @throws \App\Exceptions\RequestFailException
     */
    function throw_exception ($errMessage = null, $errorData = []) {
        $exceptin = new \App\Exceptions\RequestFailException((string) $errMessage);
         # 設置異常數據
        if ($errorData) {
            $exceptin->setBindData($errorData);
        }
        throw $exceptin;
    }
}

if (!function_exists('check_validate')) {
    /**
     * 检查验证 然后选择是否跑出验证失败的异常
     *
     * 用例：
     *        $data = [
     *            'aaa'    => 'hello world',
     *            'bbb'    => 123232,
     *            'c'     => 'wangfei@163.com'
     *        ];
     *        $checkData = pick_array($data, ['aaa', 'bbb', 'c' => 'ccc']);
     *
     *        check_validate($checkData, [
     *            'aa'    => 'required|min:50',
     *            'bb'    => 'integer',
     *            'cc'    => 'email'
     *        ]);
     *
     * @param $data                     验证数据
     * @param array $rules 规则
     * @param array $messages 自定义错误
     * @param array $customAttributes 自定义字段名
     * @param bool $throwException 抛出或者返回异常 true/null 抛出异常  false不抛异常返回错误信息
     * @param null $errorCallback 错误时的回调函数    参数$error->all(); $error->messages();
     * @return mixed                    true 验证通过| 错误信息
     * @throws \App\Exceptions\RequestFailException    验证错误异常
     */
    function check_validate ($data, $rules = [], $messages = [], $customAttributes = [], $throwException = true, $errorCallback = null) {
        $validator = validator($data, (array) $rules, (array) $messages, (array) $customAttributes);

        # 判断是否返回验证失败异常
        if (!$validator->fails()) {
            return true;
        }
        $errors = $validator->errors();
        # 错误时的回调
        if (is_callable($errorCallback)) {
            $errorCallback($errors);
        }

        # 检查是否抛出异常
        $throwException = $throwException || is_null($throwException);
        if (!$throwException) {
            return $errors;
        }

        # 抛出异常
        throw_exception('数据验证失败', $errors->messages());
    }

}